package com.tesisutn.restsoft.dominio.pedido;

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;

import com.tesisutn.restsoft.dominio.articulo.Articulo;
import com.tesisutn.restsoft.dominio.interfaces.ObjetoDeDominio;
import com.tesisutn.restsoft.dominio.pedido.estadosDetalle.EstadoDetalleDePedido;

@Entity
public class DetalleDePedido implements ObjetoDeDominio{
	@Id
    @GeneratedValue
	private Long id;
	@ManyToOne
    private Articulo articulo;
    private Integer cantidad;
    private Double precio;
    @OneToOne
    private DetalleHistorialEstado detalleEstado;
    private String observaciones;
    @ManyToOne
    private Pedido pedido;
    @OneToMany
    @JoinColumn
    private Set<DetalleHistorialEstado> historial;

    public DetalleDePedido() {
        cantidad = 1;
        detalleEstado = new DetalleHistorialEstado();
        detalleEstado.setEstado(EstadoDetalleDePedido.Pendiente);
        detalleEstado.setFechaInicio(new Date());
        historial = new HashSet<DetalleHistorialEstado>();
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
    
    public DetalleHistorialEstado getDetalleEstado() {
        return detalleEstado;
    }
    
    public Articulo getArticulo() {
        return articulo;
    }

    public void setArticulo(Articulo articulo) {
        this.articulo = articulo;
    }

    public Integer getCantidad() {
        return cantidad;
    }

    public void setCantidad(Integer cantidad) {
        this.cantidad = cantidad;
    }

    public Double getSubtotal() {
        return precio * cantidad;
    }

    public Double getPrecio() {
        return precio;
    }

    public void setPrecio(Double precio) {
        this.precio = precio;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

    public Set<DetalleHistorialEstado> getHistorial() {
        return historial;
    }
    
    public void preparar() {
        detalleEstado.getEstado().preparar(this);
    }

    public void terminar() {
        detalleEstado.getEstado().terminar(this);
    }

    public void entregar() {
        detalleEstado.getEstado().entregar(this);
    }

    public void anular() {
        detalleEstado.getEstado().anular(this);
    }

    public void cancelar() {
        detalleEstado.getEstado().cancelar(this);
    }

    public void addNuevoEstadoAlHistorial(EstadoDetalleDePedido estado){
        //Creo un nuevo DetalleHistorialEstado con la fecha actual, y el parámetro estado
        DetalleHistorialEstado nuevoDetalleEstado = new DetalleHistorialEstado();
        nuevoDetalleEstado.setEstado(estado);
        nuevoDetalleEstado.setFechaInicio(new Date());

        //Le pongo fecha de fin al estado actual
        detalleEstado.setFechaFin(new Date());
        //Agrego al historial el estado actual
        historial.add(detalleEstado);
        
        //Reemplazo el estado actual por el nuevo estado
        detalleEstado = nuevoDetalleEstado;
    }
}
